package _02_FunInterface;

/**
 * 函数式接口 - 无参
 * 
 * @author lenovo
 * @date 2020年7月28日 @time 上午9:20:50
 */
public class _01_FunInterface {
	// 自定义静态方法,接收接口对象
	public static void call(MyFunctionInter func) {
		// 调用接口内的成员方法
		func.printMessage();
	}

	public static void main(String[] args) {
		// 1.8 之前写法
		// 第一种 子实现类
		Test t = new Test();
		call(t);

		// 第二种 匿名内部类
		call(new MyFunctionInter() {

			@Override
			public void printMessage() {
				// TODO Auto-generated method stub
				System.out.println("匿名内部类的方式");
			}
		});

		// 1.8 新特性写法

		// 第一种调用 : 直接调用自定义的 call 方法,传入箭头函数
		// 这个箭头函数,就等于是实现类中实现的这个抽象方法,只不过不用写实现类
		// 并且也比匿名内部类的写法简单
		call(() -> {
			System.out.println("lammbda写法");
		});

		// 第二种调用 : 先创建函数对象,类似实现接口的内部类对象
		MyFunctionInter inter = () -> {
			System.out.println("保存为函数对象变量,再调用");
		};
		// 传入自定义方法
		call(inter);
		// 调用call 方法就会自己去找对应的回调方法

		// 调用实现的这个方法
		inter.printMessage();
	}

}

//函数式接口,只能由一个抽象方法,但是可以有默认方法
@FunctionalInterface
interface MyFunctionInter {
	void printMessage();
}

//实现类
class Test implements MyFunctionInter {

	@Override
	public void printMessage() {
		System.out.println("实现类的方式");
	}

}